from .exts import db


# 模型、数据库操作
# 一对多


# 班级：学生 = 1:N
class Grade(db.Model):
    __tablename__ = 'grade'  # 表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    # 建立关联, 反向引用，第1参数是模型类名，第2个参数是反向引用名， 第3个参数是加载方式 lazy=True 懒加载
    # students不是字段，只是类属性
    students = db.relationship('Student', backref='grade', lazy=True)


# 学生表
class Student(db.Model):
    __tablename__ = 'student'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    age = db.Column(db.Integer)
    # 外键
    grade_id = db.Column(db.Integer, db.ForeignKey('grade.id'))


# 多对多
# 用户表:电影 = N:N
# 用户表
# 用户收藏电影
# 中间表:收藏表
collect = db.Table(
    'collects',
    # 定义两个字段
    db.Column('user_id', db.Integer, db.ForeignKey('usermodel.id'), primary_key=True),
    db.Column('movie_id', db.Integer, db.ForeignKey('movie.id'), primary_key=True),
)


class UserModel(db.Model):
    __tablename__ = 'usermodel'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30))
    age = db.Column(db.Integer)

# 电影表
class Movie(db.Model):
    __tablename__ = 'movie'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30))

    # 关联
    users = db.relationship('UserModel', backref='movies', lazy=True, secondary=collect)

    # lazy属性
    # select: 当访问到属性的时候，就自动执行查询
    # joined: 当访问到属性的时候，就把两张表关联成一条SQL语句
    # subquery: 当访问到属性的时候，就把数据都加载到内存中
    # dynamic: 当访问到属性的时候，返回一个query对象
    # true: 等价于select


